﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Business_Layer;
using log4net;
using log4net.Config;
using Data_Access_Layer;
namespace CaffeBillard
{
	public partial class FormAccount : DevComponents.DotNetBar.Office2007Form	{
		public FormAccount()
		{
			InitializeComponent();
			dgvAccount.AutoGenerateColumns = false;
		}

		protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
		#region Khai báo
		private bool _allSelecte;
		private Account account;
		private AccountController _manager;
		private Account _acc;
		bool _curr;
		private Utility _com;
		#endregion
		private void FormAccount_Load(object sender, EventArgs e)
		{
			account = WorkSession.Current.CurrentAccount;
			_manager=new AccountController();
			if (GetEmpId() == 1)
				gbManager.Visible = true;
			else
			{
				gbManager.Visible = false;
			}
			txtUsename.Text = account.Username;
			LoadAll_Account();
			Binging_CBB();
			_com = new Utility();
		}
		#region Ham Bo Tro
		/// <summary>
		/// đỗ dữ liệu lên các combobox.
		/// </summary>
		void Binging_CBB()
		{
			cbxNhanVien.Enabled = false;
			txtKeyWordFind.Enabled = false;

			clEmpId.DataSource = Employee.Objects.Where(x => x.Deleted == false).ToList();
			clEmpId.ValueMember = "Id";
			clEmpId.DisplayMember = "Name";
			cbxNhanVien.DataSource = Employee.Objects.Where(x => x.Deleted == false).ToList();
			cbxNhanVien.DisplayMember = "Name";
			cbxNhanVien.ValueMember = "Id";

		}
		/// <summary>
		/// Hàm lất mã nhân viên của tài khoản.
		/// </summary>
		/// <returns></returns>
		int GetEmpId()
		{
			//Account account = Account.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.Id);
			var emp = Employee.Objects.FirstOrDefault(x => x.Id == account.EmpId);
			return emp.RoleId;
		}
		void reset()
		{
			txtPassLast.Text = "";
			txtPassNew.Text = "";
			txtPassNew2.Text = "";
		}
		#endregion
		
		
		/// <summary>
		/// Sự kiện khi nhấn nút bntDelete, xóa trong dgvAccount.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void btnDelete_Click(object sender, EventArgs e)
		{
			XmlConfigurator.Configure();
			log.Info("Tai Khoan: Xoa Tai Khoan");
			try
			{
				int index = 0;
				var SelectedRows = dgvAccount.Rows.Cast<DataGridViewRow>().Where(x => x.Cells[1].Value != null && x.Cells[0].Value != null && x.Cells[1].Value.ToString() != "0" && x.Cells[2].Value != null && (bool)x.Cells[0].Value).ToList();
				if (SelectedRows.Count == 0)
				{
					MessageBox.Show("Không có dữ liệu để xóa.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					LoadAll_Account();
					return;
				}
				if (MessageBox.Show("Những tài khoản bạn chọn sẽ được xóa, bạn có chắc chắn muốn xóa", "Thông báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
				{
					bool kq = false;
					for (int i = 0; i <= SelectedRows.Count - 1; i++)
					{
						var row = SelectedRows[i].DataBoundItem as Account;
						if (Employee.Objects.FirstOrDefault(x => x.Id == row.EmpId).RoleId == 1 && row.Id == WorkSession.Current.CurrentAccount.Id)
						{
							index = i;
							kq = true;
							break;

						}
						else
						{
							kq = false;
						}
					}
					if (kq == true)
					{
						if (MessageBox.Show(
							"Bạn sẽ xóa tài khoản bạn đang đăng nhập làm quyền Quản Lý,nếu xóa chương trình sẽ" +
							"thóat ra va đăng nhập la, Bạn có muốn xóa? ",
							"Thông báo",
							MessageBoxButtons.YesNo) == DialogResult.No)
						{
							for (int i = 0; i <= SelectedRows.Count - 1; i++)
							{
								if (i == index)
									i++;
								if (i < SelectedRows.Count)
								{
									var row = SelectedRows[i].DataBoundItem as Account;
									row.Deleted = true;

									_manager.Delete(row);
								}
							}
							LoadAll_Account();
						}
						else
						{
							for (int i = 0; i <= SelectedRows.Count - 1; i++)
							{
								var row = SelectedRows[i].DataBoundItem as Account;
								row.Deleted = true;
								_manager.Delete(row);
							}
							LoadAll_Account();
							var login = new FormLogin();
							login.Show();
							foreach (Form form in Application.OpenForms)
							{
								if (form.GetType() == typeof(FormMain))
								{
									form.Hide();
								}
							}
						}
					}
					else
					{
						for (int i = 0; i <= SelectedRows.Count - 1; i++)
						{
							var row = SelectedRows[i].DataBoundItem as Account;
							row.Deleted = true;

							_manager.Delete(row);
						}
						LoadAll_Account();

					}
				}
				else
				{
					LoadAll_Account();
				}
		
			}
			catch (Exception ex)
			{
				MessageBox.Show("Lỗi : \n" + ex.Message);
			}
			
		}
		/// <summary>
		/// lấy tất cả các tài khoản đang sử dung - Deleted=false.
		/// </summary>
		void LoadAll_Account()
		{
			
			dgvAccount.DataSource = new BindingSource {DataSource = _manager.GetAll()};
			
		}
		/// <summary>
		/// Chọn hết các dòng trong dgvAccount
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvAccount_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (e.RowIndex == -1)
			{
				if (e.ColumnIndex == 0)
				{
					if (_allSelecte)
					{
						int i = 0;
						dgvAccount.Rows[0].Cells[0].Value = false;
						do
						{
							dgvAccount.Rows[i].Cells[0].Value = false;
							i++;
						}
						while (i < dgvAccount.Rows.Count - 1);

						_allSelecte = false;
					}
					else
					{
						int i = 0;
						dgvAccount.Rows[0].Cells[0].Value = true;
						do
						{
							dgvAccount.Rows[i].Cells[0].Value = true;
							i++;
						}
						while (i < dgvAccount.Rows.Count - 1);

						_allSelecte = true;
					}
				}
			}
		}
		/// <summary>
		/// sự kiện khi đã hoàn thành việc thay đổi trên một cell của dgvAccount và ra ngoài cell đó.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvAccount_RowValidated(object sender, DataGridViewCellEventArgs e)
		{

			if (_curr)
			{
				try
				{
					var acc = dgvAccount.Rows[e.RowIndex];
					//_acc = acc.DataBoundItem as Account;

					if (acc.Cells[1].Value.ToString() == "0")
					{
						XmlConfigurator.Configure();
						log.Info("Nhan vien: Them moi mot tai khoan");
						_acc = acc.DataBoundItem as Account;
						_acc.Deleted = false;
						_acc.LastLogin = null;

						if (_acc.EmpId == 0)
						{
							MessageBox.Show("Bạn phải chọn nhân viên sử dụng tài khoản này.");

							return;
						}

						for (int i = 0; i < dgvAccount.Rows.Count - 2; i++)
						{
							if (_acc.EmpId == int.Parse(dgvAccount.Rows[i].Cells[4].Value.ToString()))
							{
								MessageBox.Show("Nhân viên này đã có tài khoản.");
								return;
							}
							if (_acc.Username == dgvAccount.Rows[i].Cells[2].Value.ToString())
							{
								MessageBox.Show("Không được nhập trùng tên tài khoản.");
								return;
							}
						}
						if (_manager.Insert_Update(_acc))
						{
							MessageBox.Show("Thêm thành công!!!", "Thông báo", MessageBoxButtons.OK,
											MessageBoxIcon.Information);
							LoadAll_Account();
						}
						else
						{
							MessageBox.Show("Không thêm được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
											MessageBoxIcon.Information);
						}
					}
					else
					{
						XmlConfigurator.Configure();
						log.Info("Tai Khoan: Cap nhat thong tin tai khoan");
						_acc = acc.DataBoundItem as Account;
						for (int i = 0; i < dgvAccount.Rows.Count - 1; i++)
						{
							if (_acc.EmpId == int.Parse(dgvAccount.Rows[i].Cells[4].Value.ToString()) && _acc.Id != int.Parse(dgvAccount.Rows[i].Cells[1].Value.ToString()))
							{
								MessageBox.Show("Nhân viên này đã có tài khoản.");
								LoadAll_Account();
								return;
							}
							if (_acc.Username == dgvAccount.Rows[i].Cells[2].Value.ToString() && _acc.Id != int.Parse(dgvAccount.Rows[i].Cells[1].Value.ToString()))
							{
								MessageBox.Show("Không được nhập trùng tên tài khoản.");
								LoadAll_Account();
								return;
							}
						}
						// Trường hợp người đăng nhập là Quản lý, cập nhật lại quyền của mình thấp hơn quản lý,
						//lúc này chương trình sẽ thoát ra và đăng nhập lại.
						if (Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).RoleId == 1 && _acc.Id == WorkSession.Current.CurrentAccount.Id && Employee.Objects.FirstOrDefault(x => x.Id == _acc.EmpId).RoleId != 1)
						{

							if (MessageBox.Show(
								"Nếu bạn chọn đổi phân quyền của bạn từ quyền Quản Lý sang quyền thấp hơn thì chương trình sẽ thoát lần đăng nhập hiện tại và đăng nhập lại, Bạn có muốn thay đổi? ",
								"Thông báo",
								MessageBoxButtons.YesNo) == DialogResult.No)
								LoadAll_Account();
							else
							{
								if (_manager.Insert_Update(_acc))
								{
									MessageBox.Show("Cập nhật thành công!!!", "Thông báo", MessageBoxButtons.OK,
													MessageBoxIcon.Information);
									account.Password = dgvAccount.Rows[e.RowIndex].Cells[3].Value.ToString();
									WorkSession.Current.CurrentAccount = _acc;
									//account = _acc;
									LoadAll_Account();
									var login = new FormLogin();
									login.Show();
									foreach (Form form in Application.OpenForms)
									{
										if (form.GetType() == typeof(FormMain))
										{
											form.Hide();
										}
									}
								}
								else
								{
									MessageBox.Show("Không cập nhật được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
													MessageBoxIcon.Information);
								}


							}
						}
						else
						{
							if (_manager.Insert_Update(_acc))
							{
								MessageBox.Show("Cập nhật thành công!!!", "Thông báo", MessageBoxButtons.OK,
												MessageBoxIcon.Information);
								account.Password = dgvAccount.Rows[e.RowIndex].Cells[3].Value.ToString();
								//WorkSession.Current.CurrentAccount = _acc;

								LoadAll_Account();
							}
							else
							{
								MessageBox.Show("Không cập nhật được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
												MessageBoxIcon.Information);
							}
						}


					}
				
				}
				catch (Exception ex)
				{
					MessageBox.Show("Lỗi:\n..." + ex.Message);

				}
			}
			_curr = false;
		}
		/// <summary>
		/// sự kiện khi đang thay đổi thông tin trên một cell của  dgvAccount.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void dgvAccount_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
		{
			try
			{
				if (dgvAccount.IsCurrentRowDirty && e.ColumnIndex > 0)
				{
					var acc = dgvAccount.Rows[e.RowIndex];
					if (acc.Cells[2].Value == null||acc.Cells[3].Value == null)
					{
						MessageBox.Show("Không được bỏ trống dử liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning

						);
						e.Cancel = true;
					}
					
				}
				
			}
			catch (Exception ex)
			{
				MessageBox.Show("Lỗi hệ thống:");
			}
			if (dgvAccount.IsCurrentRowDirty && e.ColumnIndex != 0)
				_curr = true;
			else
			{
				_curr = false;
			}
		}

		/// <summary>
		/// In dữ liệu ra máy in
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void btnPrint_Account_Click(object sender, EventArgs e)
		{
			CustomEx ex = new CustomEx();
			ex.Show();
			ex.FormClosed+=ExOnFormClosed;
		}
		/// <summary>
		/// delegate khi đã đóng đóng form CustomEx.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="formClosedEventArgs"></param>
		private void ExOnFormClosed(object sender, FormClosedEventArgs formClosedEventArgs)
		{
			if (CustomEx.Hz.type == 2)
			{
				XmlConfigurator.Configure();
				log.Info("Tai Khoan: Xuat danh sach tai khoản ra PDF");
				ExportAccountPDF();
			}
			else
			{
				if (CustomEx.Hz.type == 1)
				{
					XmlConfigurator.Configure();
					log.Info("Tai Khoan: Xuat danh sach tai khoan ra Excel");
					ExportAccountExcel();
				}
				else
				{
					return;
				}
			}
		}
		/// <summary>
		/// Xuất tài khoản ra PDF
		/// </summary>
		private void ExportAccountPDF()
		{
			saveFileDialog1.Filter = "(*.PDF)|*.PDF";
			saveFileDialog1.FileName = "*.PDF";
			if (dgvAccount.Rows.Count - 1 == 0)
				MessageBox.Show("Không có dữ liệu đễ xuất");
			else
			{
				if (saveFileDialog1.ShowDialog() == DialogResult.OK)
					_com.ExportToPDF(dgvAccount, saveFileDialog1.FileName);


			}
		}
		private void ExportAccountExcel()
		{
			saveFileDialog1.Filter = "(*.xls;*.xlsx)|*.xls;*.xlsx";
			saveFileDialog1.FileName = ".xlsx";
			if (dgvAccount.Rows.Count - 1 == 0)
				MessageBox.Show("Không có dòng nào để xuất");
			else
			{
				if (saveFileDialog1.ShowDialog() == DialogResult.OK)
					_com.ExportToExcel(dgvAccount, saveFileDialog1.FileName);
			}

		}
		/// <summary>
		/// Thay đổi mật khẩu của nhân viên
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void btnUpdate_Click_1(object sender, EventArgs e)
		{
			XmlConfigurator.Configure();
			log.Info("Tai Khoan: Thay doi mat khau tai khoan dang  nhap");
			if (txtPassLast.Text == "" || txtPassNew.Text == "" || txtPassNew2.Text == "")
			{
				MessageBox.Show("Bạn phải điền đầy đủ thông tin tài khoản", "Thông báo", MessageBoxButtons.OK,
								MessageBoxIcon.Warning);
				return;
			}
			else
			{
				if (txtPassNew.Text != txtPassNew2.Text)
				{
					MessageBox.Show("Bạn phải nhập lại mật khẩu phải trùng với mật khẩu mới.");
					return;
				}
				else
				{
					if (txtPassLast.Text != account.Password)
					{
						MessageBox.Show("Bạn nhập sai mật khẩu cũ,yêu cầu nhập lại");
					}
					else
					{
						Account ac = Account.Objects.FirstOrDefault(x => x.Id == account.Id);
						ac.Password = txtPassNew.Text;
						ac.LastLogin = DateTime.Now;
						if (_manager.Insert_Update(ac))
						{							
							account.Password = txtPassNew.Text;
							this.Show();
							MessageBox.Show("Đổi mật khẩu thành công!!!");
							if(GetEmpId()==1)
								LoadAll_Account();
							reset();
						}
						else
						{
							MessageBox.Show("Thất bại");
						}
					}
				}
			}

		}
		/// <summary>
		/// reset lại các textbox bằng "";
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void btnReset_Click_1(object sender, EventArgs e)
		{
			reset();
		}

		private void cbbTypeFind_SelectedIndexChanged(object sender, EventArgs e)
		{
            if(cbbTypeFind.Text=="Tất cả")
            {
                dgvAccount.DataSource = new BindingSource { DataSource = _manager.GetAll() };
            }
			if (cbbTypeFind.Text == "Tìm kiếm ten Username" || cbbTypeFind.Text == "Tìm Theo Mã")
			{
				txtKeyWordFind.Enabled = true;
				cbxNhanVien.Enabled = false;
				cbxNhanVien.Text = "";
			}
			else
			{
				txtKeyWordFind.Enabled = false;
				cbxNhanVien.Enabled = true;
				txtKeyWordFind.Text = "";
				cbxNhanVien.Text = "";
			}
		}

		private void txtKeyWordFind_TextChanged(object sender, EventArgs e)
		{
			int n = 0;
			XmlConfigurator.Configure();
			log.Info("Tai Khoan: Tim kiem thong tin Tai Khoan");
			if (cbbTypeFind.Text == "Tìm Theo Mã")
			{
				if (txtKeyWordFind.Text == "")
					LoadAll_Account();
				if (int.TryParse(txtKeyWordFind.Text, out n))
					dgvAccount.DataSource = new BindingSource { DataSource = _manager.FindById(n) };
			}
			else
			{
				if (cbbTypeFind.Text == "Tìm kiếm ten Username")
				{
					if (txtKeyWordFind.Text == "")
						LoadAll_Account();
					else
					{
						dgvAccount.DataSource = new BindingSource { DataSource = _manager.FindByUsername(txtKeyWordFind.Text) };
					}
				}
			}
		}

		private void cbxNhanVien_SelectedIndexChanged(object sender, EventArgs e)
		{
			XmlConfigurator.Configure();
			log.Info("Tai Khoan: Tìm kiếm thông tin tai khoan");
			
			
				if (cbxNhanVien.Text == "")
					LoadAll_Account();
				else
				{
					int r = 0;
					if (cbxNhanVien.ValueMember is DataRowView)
					{
						DataRowView row = cbxNhanVien.SelectedValue as DataRowView;
						r =int.Parse(row["Id"].ToString());
						if (r > 0)
							dgvAccount.DataSource = new BindingSource { DataSource = _manager.FindByName_EmpId(r) };
					}
					
					if (cbxNhanVien.ValueMember != "")
					{
						r = Employee.Objects.FirstOrDefault(x => x.Name == cbxNhanVien.Text).Id;
						if (r > 0)
							dgvAccount.DataSource = new BindingSource { DataSource = _manager.FindByName_EmpId(r) };
						else
						{
							dgvAccount.DataSource = null;
						}
					}
					else
					{
						//dgvAccount.DataSource = new BindingSource { DataSource = _manager.FindByName_EmpId(0) };
						LoadAll_Account();
					}
				}
			}
			
		}
	
}
